package DP.templateMethod.template;

/**
 * @author msi
 * 抽象模板类
 */
public abstract class AbstractClass {
    //基本方法
    protected abstract void doSomething();
    //基本方法
    protected abstract void doAnyThing();
    //模板方法
    public void templateMethod(){
        /**
         * 调用基本方法，完成相关的逻辑
         */
        this.doAnyThing();
        this.doSomething();
        /**
         * 钩子函数影响原有逻辑
         * 通过子类不同的实现，来控制每一个子类中的模板方法都不一样。
         */
        if(isAlarm()){
            this.doAnyThing();
        }
    }

    //钩子函数：默认实现。也可以在子类中重写这个方法。
    protected boolean isAlarm(){
        return true;
    }

}
